{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "1f83910f",
   "metadata": {},
   "source": [
    "# 优化模块\n",
    "\n",
    "scipy.optimize是SciPy中负责优化的子模块，这里介绍其三个主要功能：\n",
    "- 最小二乘优化和曲线拟合。\n",
    "- 无约束的优化。\n",
    "- 方程求根。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f505fb10",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d6569fbb",
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0bc6b103",
   "metadata": {},
   "source": [
    "## 多项式拟合"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "15b3e3ca",
   "metadata": {},
   "source": [
    "多项式拟合（Polynomial Curve-Fitting）用n阶多项式描述数据点(x,y)的关系。\n",
    "多项式拟合的目的是找到一组系数，使得拟合得到的曲线与真实数据点之间的距离最小。\n",
    "\n",
    "例如，考虑这样的一组数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ec996f6a",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.linspace(-5, 5, 50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "40e1901f",
   "metadata": {},
   "outputs": [],
   "source": [
    "y = 4 * x + 1.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "caaaf9c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_noise = y + np.random.randn(50) * 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3ce63443",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x114280b80>]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x, y_noise, \"x\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "36633697",
   "metadata": {},
   "source": [
    "拟合与插值不同，拟合不要求得到的曲线经过所有的数据点。\n",
    "\n",
    "多项式拟合的系数可以使用NumPy模块的np.polyfit()函数来得到："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "529add92",
   "metadata": {},
   "outputs": [],
   "source": [
    "coeff = np.polyfit(x, y_noise, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3b39ab50",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4.17438706, 1.35630552])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coeff"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "08797937",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1143793d0>,\n",
       " <matplotlib.lines.Line2D at 0x1143794c0>]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x, y_noise, \"x\", x, coeff[0] * x + coeff[1])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "99f06fff",
   "metadata": {},
   "source": [
    "多项式函数还可以通过函数`np.ploy1d()`生成："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "d0336fe1",
   "metadata": {},
   "outputs": [],
   "source": [
    "f = np.poly1d(coeff)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "428cbb4d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "poly1d([4.17438706, 1.35630552])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "cd706b0a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " \n",
      "4.174 x + 1.356\n"
     ]
    }
   ],
   "source": [
    "print(f)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "34a4d4c9",
   "metadata": {},
   "source": [
    "生成的多项式对象支持数学运算得到新的多项式："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "6ab3e047",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "       2\n",
      "17.43 x + 15.5 x + 8.196\n"
     ]
    }
   ],
   "source": [
    "print(f ** 2 + 2+ f + 3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37d81192",
   "metadata": {},
   "source": [
    "考虑更复杂的拟合："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "807d02f4",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.linspace(0, np.pi * 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "529ece88",
   "metadata": {},
   "outputs": [],
   "source": [
    "y = np.sin(x)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "83828aa5",
   "metadata": {},
   "source": [
    "分别使用1阶，3阶和9阶多项式对这组数据进行拟合："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "5d3f685a",
   "metadata": {},
   "outputs": [],
   "source": [
    "f1 = np.poly1d(np.polyfit(x, y, 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "b66c2eec",
   "metadata": {},
   "outputs": [],
   "source": [
    "f3 = np.poly1d(np.polyfit(x, y, 3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "499910e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "f9 = np.poly1d(np.polyfit(x, y, 9))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b0b5a970",
   "metadata": {},
   "source": [
    "拟合曲线如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "2f0a34b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "t = np.linspace(-3 * np.pi, 3 * np.pi, 200)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "89520c75",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-9.42477796076938, 9.42477796076938, -1.5, 1.5)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD8CAYAAAB0IB+mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABsn0lEQVR4nO2dd3hb1dnAf0fLtuS9t504dpy9ByaDEcJeYW8KhaYF+vWjtHTQQtuvLV20tNCGPcps2SOETQKE7OE423bseO9tbZ3vD1mOk3jIlmRJ9v09j55c6Z57zhtJfnXuO4WUEgUFBQWFsY/K3wIoKCgoKIwOisJXUFBQGCcoCl9BQUFhnKAofAUFBYVxgqLwFRQUFMYJisJXUFBQGCd4ReELIZ4WQtQLIYoGOH+aEKJNCLGr5/FLb6yroKCgoOA+Gi/N8yzwCPD8IGO+lFJe4KX1FBQUFBSGiVd2+FLKDUCzN+ZSUFBQUPAN3trhu8MpQojdQDVwj5Ryb3+DhBC3A7cDGAyGefn5+aMoosKoISUI4d5YqxG0Yb6VR0GhD0abkdK2UjIjMonQRfhbnGGxffv2RillQn/nRkvh7wCypJSdQojzgLeA3P4GSikfBx4HmD9/vty2bdsoiagwWhy97Xbs7W1MePXVoQfX74c1S2HFA1Bwp89lU1AA2FC5gTs+vYMXznuBWQmz/C3OsBBClA90blQUvpSyvc/xWiHEP4UQ8VLKxtFYXyGwiLr4YqTZ5N7ghHxY+X8w6yrfCqWg0Idmk9NCHRsa62dJvMuoKHwhRDJQJ6WUQoiFOH0HTaOxtkLgEXXB+e4PFgIWr3YeO+zQVAIJeb4RTEGhhxZTCzD2FL63wjJfBr4BJgshKoUQtwohVgshev5SuRwo6rHh/x24WiplOsct9s4uLJWVw7/w41/Ckyugo877Qiko9CE/Np/rplyHXqP3tyheRQSy3u3Phm+1WqmsrMRkctMkoNAvoaGhpKeno9VqR33t+r/9jabHnyB/bxHCXcctQOtRKP4U5n/Ld8IpKAQ5QojtUsr5/Z0bzSgdr1BZWUlERATZ2dnDUxYKvUgpaWpqorKykgkTJoz6+urwcHA4kEYjQj+MHVR05jFl31oBhnglekfBJ7SZ29Br9GjVo78h8iVBV1rBZDIRFxenKHsPEEIQFxfnt7sklcEAgL2zc2QTmNrhyTPhgx97USoFhWN85+PvcNfnd/lbDK8TdDt8QFH2XsCf76EqPBwAR1fXyCYIjYTTfw6Zp3hRKgWFYzSbmsmJzvG3GF4nKBW+QnDj2uE7urpHPsm8m44dN5dC7EQPpVJQcCKlpNnUPOYidCAITTqBxgMPPMCf//znAc+/9dZb7Nu3bxQlCnxUhp4d/khNOn3Z/Qo8shAqt3s+l4ICzixbs91MTGiMv0XxOmNa4a9ZX8LGkuNzuzaWNLJmfcmoyaAo/JPp3eF3j9Ck05fJ58KyeyBlpudzKSgATSZnipCyww8yZqZHcedLO3uV/saSRu58aScz06M8mve3v/0teXl5LFmyhIMHDwLwxBNPsGDBAmbNmsVll11Gd3c3Gzdu5J133uFHP/oRs2fPpqSkpN9x4w11eI/C98YOPzQKTvsJqLVg7oQuJXlbwTMMWgP/M/d/mBE/w9+ieJ0xrfALcuJ55No53PnSTh766CB3vrSTR66dQ0FO/Ijn3L59O6+88gq7du1i7dq1bN26FYBVq1axdetWdu/ezZQpU3jqqacoKCjgoosu4k9/+hO7du0iJyen33HjDY+dtv0hJbxwGbxynfNYQWGExIbG8u0Z31actsFIQU481y/K5O+fFfP9MyZ5pOwBvvzySy699FL0PfHjF110EQBFRUXcd999tLa20tnZydlnn93v9e6OG8uoIiNJ+MH/EDrDi2YYIaDgLlDr3K/CqaDQDy2mFrpt3aQYUlCJsbUnHlv/m37YWNLIC5uP8v0zJvHC5qMn2fS9xc0338wjjzzCnj17uP/++weMcXd33FhGpdMRv3o1YdOneXfiKRdA3krncVuVd+dWGDe8fvh1znn9HMx2s79F8TpjWuG7bPaPXDuHu1dO7jXveKL0ly1bxltvvYXRaKSjo4N3330XgI6ODlJSUrBarbz44ou94yMiIujo6Oh9PtC48Ya1thZrfb1vJq/aDv+YC4X/9c38CmOaJmMTeo2eMM3Yy+Ie0wq/sLLtOJu9y6ZfWNk24jnnzp3LVVddxaxZszj33HNZsGABAL/5zW9YtGgRp556Kn2btlx99dX86U9/Ys6cOZSUlAw4brxRds21NDz0V99MnjwLFq2GnDN8M7/CmKbJ2ER8mGem30Al6Iqn7d+/nylTpvhJorGFP9/L9o8+QhOfgH7uHN8u5HBAVz1EJPt2HYUxwy0f3oLNYeP5cwdr0R24DFY8bUzv8BUCl8iVK32v7AHW3QtPnQWmkd/VKYwvxvIOf8xH6SgEJubSUhxdXYTN8HGs86yrnVU2QyJ9u47CmOGO2XcEXR9bd1EUvoJfaHj475hLisl57z3fLpQ2z/kAZ1JWWCyolBtbhYFZmb3S3yL4DOWbr+AXVAYDjk4vJl4NRWc9rFkC6x8cvTUVgo5uazc763fSbmkfenAQoih8Bb+gCjd4N9N2KAwJMOcGmHrx6K2pEHQcaTvCjR/cyI66Hf4WxScoJh0Fv6AyOBW+lHJ0avMLAWf8/NjzriYwxPl+XYWgotHozNGJCx2b3w1lh6/gF9QGQ2+bw1Fnx/PwjznQNHpVUxWCA1elzLEapaMofAW/4CqgNuI2h54w8XSYeTVEpY/+2goBjWuHHxs29kojg6Lw/c4tt9xCYmIi06dP97coo8qxrlejaMd3EZ0B5/0RNCFgNTofCgo4Y/AjdBGEqEP8LYpPUBS+n7n55ptZt26dv8UYdXq7XnnS5tBT7DZ4/mJ467v+k0EhoLgi7woeXDp2I7kUp+0IWbVqFVOnTmXDhg2UlZXx9NNPs2LFimHPs2zZMsrKyrwvYIDTu8P3h0nHhVoD01ZBVJr/ZFAIKCbFTGJSzCR/i+Ezgn+H/8z5sLOn6qTd6ny++1Xnc0u383nR687npjbn833vOJ93NTmfH/zA+byjzu1l9+zZQ3R0NBs2bODhhx8+qfLl0qVLmT179kmPTz75xJP/7ZghJHcSqX/+MyE5fm4+vng1TLnQeWxs9asoCv5nQ+UGiluK/S2Gz1B2+COgu7ubtrY2/vd//xcAq9VKdHT0cWO+/PJLP0gWPGhiY4m64Hx/i3GM8m/gpavgqn/DxOX+lkbBT/xkw0+4MOdCfrrop/4WxScEv8L/1vvHjtXa45/r9Mc/D406/rkh7vjnEUluLblv3z7mzZuHWq0GoLCw8CSn69KlS4+rg+/iz3/+84hMP2MNabPRvX0H2rQ0dOkBYFJJmgb550HC+C1ZPd4x2810WDvGbEgmeEnhCyGeBi4A6qWUJ4WbCGdmzcPAeUA3cLOUMmhT2fbs2cPs2bN7nxcWFnLxxcdncCo7/MGRNhtHb7qJhLvvJv722/wtDoRGwqVrnMdSgqUTQsZmAS2F/mkyOmPw48LGZtIVeM+G/yxwziDnzwVyex63A//y0rp+4USFX1RUNOKwymuuuYZTTjmFgwcPkp6ePm6amouQEDKffYaoiy70tygn8/4P4flLwOq/9pNr1pf0dmZzHW8saWTNemeyWN9jBe/QYGwAxm7SFXhphy+l3CCEyB5kyMXA89LZbWWTECJaCJEipazxxvqjzUMPPXTc89LS0hHP9fLLL3sqzpBIKXHYJSq1GJ0yBm4ghMCweLG/xeifnDMgPMkZpz/KrFlfwsz0KGamR3HnSzv5x9Wz0NU3csfaIrq0On50dt5xrTs3ljRSWNnG6uU5oy7rWKOx2/kDmxCW4LU5rWY7dqsDbYgatdb/MTKjZcNPAyr6PK/seS0oFX4wIKXE3G2ju92CzWIHQKgEIWEaDNEhqDX+//J1btiA0GgwFBT4W5TjmXKB8wFg7oSQ8FFZ1iEdWEN38d0PPuJ3c2/nvsYa9v6+E6suim8TQavawUdvHeJRveSfNy8E6FX8Cp6zIGUBz53zHNlR2R7PVX24hZ0fV3B0bxMOu0SoBBNnxzN7RSbJE6M8F3aEBJzTVghxO06zD5mZmX6WJjhxOCQdTUbM3TbUGhWGqBCEWmAz2zF32zAbbUTEhvpbTBr+8Qjq6OjAU/guWivgmfNg2T0w7yafLvXbjz9lc8djHOnYz6n1eVQ+WYFNm4rKepBm3QZ0mUuJ7EzgtGYVZzXUsG17Gc8ebDmuZ7OCZ0TqIpmbNNejORwOydb3jrDtgzL0kTpmnJ5ORGwo7Y1GDm6upXRnA4svyWHOyky/3G2PlsKvAjL6PE/vee0kpJSPA4+Ds6et70UbWzgckta6bmwWO+HRIYRF6o59sSLAZrXT0WSivdGI1Wz3q6zqiAgc7QFcdzwiBbKXQMpMny6zt3Evb9X9HJNF8IOO72CtyUEtO/mUCgqnWIjL3Ee77TNovJS7tVPpqkmg7YtWrl+Z2qvsFdOO53xd9TUmu4kzM88c0fVSSr548QD7v64hvyCFZVfloQ1R955fdNFEPnv+AN+8WUJni5mlV+WOutIfrfv6d4AbhZPFQFuw2u8DGSklHY1GbBY7kQlh6KNCTvpCabRqohP1aEPUmDqtlBc1+UlaUEVG+qd4mruoNXDpvyC1x2Ri8U0ZiH/v/zdxYdH8NuIBLEU5aK3tPB3pYFdCMlrLVK7J+DMY8yDhdXYubOT1WAd6h6Droyq+KqzotenPTPefqWAs8ML+F3i88PERX7/l3SPs/7qG+edlc+aNU45T9gC6UA1n3zaNWSsy2PNFJYWfVXoq8rDxisIXQrwMfANMFkJUCiFuFUKsFkKs7hmyFigFioEngO95Y12F4+lus2A22giPCSVUrx1wnFAJohL1qDSCT57dR1ebeRSlPEbA7/D7su0Z+Ncpzs5ZXsIVffPrgl/z1KlraFnXhsph5ZlISUxOCs9+awGP3TCPRz+p4s5pvyU7bB6f1T/Bj2+aSERBNLEODbv+sJbv/Hu7YtrxAg3dDSN22JbvbWLb2jKmFKSw8MIJA44TQnDqqklMnJPAV68dpupgy0jFHRFeUfhSymuklClSSq2UMl1K+ZSUco2Uck3PeSmlvENKmSOlnCGl3OaNdRWOYbPY6WozE6LXEhYxsLJ3oVIJwsK1WM12Pnt+P84AqtFFFRGBvZ/ktIAkdTZkLPZqbH63bgt3vLKebWXt7P3nLjq18WyVdWTPnEBNz49wQU48T908HynVnJVwDz+e9RDnTsnj9hvnEakuR0Tkcl1braLsvUCDsYEE/fAVvrnbyuf/PkBMioHFBSE0P/0MLa+8imn//n7HC5Vgxc1TiYwP47MXDmC1jJ5pNeCctgrDR0pJe5MJoRJExJ5sxhkIlVpFwaocvnz1MIe31ZG3INnHkh6POjICaTLhsFhQ6XSjuvawSZ0Dqx5zHtssoNJ41Ay9uKWY5w4/yLIFF3P/s5Fc3BDJEdnMom+dwW1Lc44LvSzIiT9Job+wcwN/iIrnf6vr0Zoj+HJXOUtnZym2/BFidVhpMbWMaIf/9evFdLdbKEgqpvyiW8DhcJ5QqYi7/TYS7rgDoT1+E6YNUXPG9fm89dedbHmnlFMvz/XGf2NI/B+bp+Axpk4rNoudiJgQVOrhfaTTl6cTnxHON2+W9IZvjhaqCOdu2REsu3xw1s5//mL49AGPpnlk1yPoNXp+teQHXGzV0S0kLJ3AbUudirogJ55Hrp1DYWXbSdc+v+Nz/lB4B6efWs5mgxlrSDTb/rKWJ74sUWz5I6TJ2IREDjvpqrGyk/0ba5h5RjoTb7yA+O9+l0mff8akzz4l6pJLaFrzGDX3P9DvtWmTY5i6JJXdn1XSWjc6ZcIVhe9HTCYTCxcuZNasWUybNo37779/2HNIh6SrzYJGpybEMLQp50RUKsGpl+fS2Wxm92cVQ1/gRdSRkUCQKXxNqNO8kzzyyJ1ffbSOT49+yo3TbmTLvzYgWu3IFAtrDzb0ZteCU+n3t1Pvas8gP2ouO9pf5vK7liA6iwkJy+HVNxVb/khJCEtg3WXrODv77GFd982bJeg0knkr0tDExZFw151oU1LQpqaS+rvfEved79D2xhu0r/uw3+sXXTQRtVbF5ndHnrw5HBSF70dCQkL47LPP2L17N7t27WLdunVs2rRpWHMYO6047A7Co9035ZxI+uQYsmfGs+PDo5iNthHNMRJ62xwGk8IXAs75Pcy43PncNnyH9wHTa2A3YG85lV3FYejo5L8OFXevzOXOl3Yep/T747unTeJ3y++jy9rFltaX4YzJgOCmrk5F2Y8QtUpNWngaUSHu3x1VHmzh6N4mMve/iemDt/sdk3DnHYTOmEHN/fdjazz5c9VH6ph9ZgbF2+ppOOr7vwNF4Y+QVatWcd9997Fs2TIyMzNHVOdeCEF4j9KzWq1YrdZhKW2HQ9LdbkYbokYX5pk7ZuEFE7AYbezd0G96hE/Qz51L9isvEzLRzzXxR0rZV/D3uVDfv3OuP+wOO5PiUliVcx0frK0hQmr5MEbP32+Yx21LcwY045xIbkwuV06+kv8c/C9P1JcTISvokOms/6zIk//RuGVX/S6e2vMUZrv7P+A71pWhj9Kx+Nc3EH3FFf2OEVotqQ/+Hmk00r2t/1iV2WdlEmLQsOW9IyOSfTgEvdP2W+u+ddJrZ2efzdX5V2O0GfneJydHgF486WIumXQJLaYW7v7i7uPOPXPOM26tu2fPHgoKCtiwYQNvvvkmL7744nFlj90tj2y325k3bx7FxcXccccdLFq0yK31AcxdVhx2SWS85zVfEjIjyJgay65PjjLz9HQ0OvXQF3mIOiqKsD5F6IKO6CxIzIeQSLcvUavU/ObU3+BwOHjylXdpAgpOy+rdmffnoB2I+VFX8bJtHd8+PQJregJsMLLrma/QZiVTkBOvOHCHwcbqjazZvYabprmXUd1wtIOK/S2ccmkOUQVZg44Nyckhd8N61Cf0zOg9H6ZhxvJ0tn1QRmtdN9FJ+uGK7zbKDn8EuNsAZdeuXSc9TqyFr1ar2bVrF5WVlWzZsoWiIvd2aFJKujuctvsTEzxGyrxzsjB2WDnwzejkxDnMZlpffwPTwUOjsp7Xic6A6193tkiU0tlxbRC6rd3sa9oHwGdPfYJVRpAa1cALWyqGNOP0R2kd/Gv5f7lj0aXkn5JPl60ebUQuu4+0KMlYw6S+u56Y0Bg0Kvf2wNvf2o/aZiLTtNet8S5lb2/r/+5txmnpqNUqdn3qWz9a0O/wB9uRh2nCBj0fExrj9o6+L75ogBIdHc3pp5/OunXr3Cq1bDE5q/BFxoV5LT07NTeaxKwICr+oYtqyNN+nfdts1Pz85yT+6EeETs7z7Vq+REpnSeWuBrjiuQHDNX/y4fN83vQoP5/9GK3rK9CEJpJz/XLOPtxyXAimu7h27g7pICS8nNm3LOXQC8VYDrdz5zdligN3GDQaG0nUJ7o1trPFROm+djLqvyG64Ptur1H3xz/R8dFH5Hz80Ul/W/pIHXmLkjjwTQ2LLppAWLhvwpSDXuH7A281QGloaECr1RIdHY3RaOTjjz/m3nvvdUsGY7sFlVoQYvDeRyiEYPryND57/gA1xa2k5sZ4be5+19PryfnkEzSxvl3H5wgBcTnOJiqDUGX7GqyJFH9tJMaQRZq+mu+/dYBHrp3DhbNSKaxsG5GCfmHfC/xp259455J3OBQhYHsV1182SVH2w6DB2OB2SOae9/cjJUw/JQFNgvtx+/qFC1BHRyOtVkQ/eSezz8xk/9c17P+6hrlnD24mGimKSWcEeKsBSk1NDaeffjozZ85kwYIFnHXWWVxwwQVDXme3ObCYbISF67y+C580P4kQvYY9633vvBVCoEtPQ6X3nc1y1DjlDljxgHN3bz850qmuq47Dbbu5IOc89N84TVjPaEKPS6waqa39/Inno1Pp+NOmx6lqOYxWE86+D3aNyEw0Xmnsdm+H77A72P9NLbGtB8n49jXDWiPitNOIv/22AZMMY1MNpEyKYt/X1T7LfFd2+CPAWw1QZs6cyc6dO4d9nanTaSsODR9+3P1QaHVq8hensGd9Jd3tFvSRvs2AbXnlVVQR4USdH0ANzT2hpQxevBLOfdDZSKWHj8o/QiK5ddpFfKbbh6OznOWXLfHKLjwuLI5FiSv5smYdZ5/xF9SbBadPmHxcrXzFeTs46y5b51aEzpGtlRjtIcxMMw1rd+/C0dVF58aNRKxY0e9mbeqSVD59dj/Vh1pJm+z9O19lhx9kSCkxdlrRhWp81sRk6tJUHHbJoS21Ppm/L63/+Q/t77zr83VGjbBYiEgG3fFNUz49+ilTYqdQ+t/DWLURhORG8MLmo17bhWeozwVhQ5O8nUKNnbbD7fzt0hm8u7tacd66gVatJVw3dKObwrf2oDO3MuXm4SVouWj/4AOq7vo+5gHq7OTMTUQXpmHvV9Ujmn8oFIUfZFhMdhx2h0929y5iUwwkZkVwcLPvFX5QFVBzh9BIuOkdyHB2pMLhLFfxzzP/ydXZP6H0m2o0ti5u+PFFPHLtHLcSrdzhpyuWsTRtKZWm3aw6PxNplxx57hM+3FunOG+HoLStlN9t/h0VHYNHyHS1malpCSFDlmOYObIe1uFnnglqNe0ffdTvea1OzeSFSZTubMDcPXjU10hQFH6QYeq09rYq9CWTFyfTWNFJU5Vv69WrIyNwdARJieThsu0ZePocsHSj1+ppKhFIfQZZ0e1o9KGD1ssZCf+35P947pznOOO0SYSZ6zHXwvWLMhVlPwTFLcW8fOBluq2D17PZ//YOpFCRf/rA5Y+HQhMTQ9jMmXRv2jzgmLzFydhtDkp3NYx4nYFQFH4Q4XBILEYbIXoNQuXbkMnc+UmoVIKDm3y7y1dFRGLvCOAmKJ4QngiGeG589wEe/PoZFoUacKi0TL9oBhtLGlmzvsQjZ+2JxIbGolap+bq0gVrZgtWQysYPvXMHMZap73b2OBjKaVu8p53w7moyLz/Lo/X0CxZgLCrC0dXV7/mk7EgiE8I4tKXOo3X6Q1H4QYTFaENKSegIiqQNl7AIHZnT4zi0pRbp8F2t/KBqgjJc8s+n+7In2dP1CS/v2MbO7S3EJOspT03xmV392R2f8L0NlzD5SuePyI1qm9fMRmOV+u56dCod0SHRA45pqe2iqUPLjGtOQWUweLSefuFCsNno3rmr3/NCCPIWJlF5sMXrzYkUhR9EmLusqNTCa5m1Q5E7P5GuNgs1pd4xOfSHKjICR3c30jZ6RdtGk021m7FJK382H6GzopPGKMFdL+/ymV29uTUGlbqbo0l7ibXX0tKk86rZaCxS211Lgj5h0BDnw5trQMDkU9I9Xk8/ZzZoNHRv2TLgmLwFSSCheJv3OqyBovCDBofdgdlkI0SvHbXGx9kz41FrVBRv9+6Xri/qCGey0phy3PZhQ+UGDFoDhvIZgOCjQwd9ale/+4x5LE1fyqv73yIiVUWnNp7sujpWL8/pNSMpHI/ZZibFkDLomAMf7CGOJgzRntetUhkMhE2fPqjCj0k2kJAZweFt3jXrKAo/SLAYbSAh1IuZtUOhC9WQOS2W0h31PjPrqCJ7mqCMQbOOlJKvq7+mILWAQwmX0I2JMy5dxIubynxqYrkw50K67M38nWqQDg68X6jU1hmEh894mKfOfmrA8y21XXQQRXa29+6s9QsXDmrHB8iZm0DdkXY6W0xeW1dR+H7m4YcfZvr06UybNo2//e1vA44zd9tQqVWjUsWyL5Pm+daso45yKiD7GFT4RpuRnOgcUm3z6azuJufULO7Oa2R91APc/+JnPlP6p2WcRoQugoxFFWi7qzhSrR5RrZ7xhEoMrApLdjijZabf7r3kQP2CBWCzYdq3b8AxE2c7E7u8Ga2jKHw/UlRUxBNPPMGWLVvYvXs37733HsXFxSeNczgkFpPdGZ0zSuYcFy6zTskO35h1DKecQu7XXxE6dapP5vcneq2eNSvWkLghBIFg+fI00OkJDwvhwYvzfGZXD1GH8JOFP+G7c68jNAFMIfHcnqhWlH0/tFva+f5n32dzzcBhkoe/KiM5O4LwGM/NOS70CxeQ+81Gp+IfgJhkA7Gpht4fHG+gKPwR4o0GKPv372fRokXo9Xo0Gg3Lly/njTfeOGmcxeSMzvF17H1/6EI1pOfHUFbY6JP6HqrQUDRxcQj16N65+Jo160v44pCzHlForRG9tZkDZgtrDkfCbZ8zb9ZsZzimj2qmXJRzEZaubF7VOk1m2w6ZlUidfqjprOHzis9pNbf2e76ltJ7mZgdJne43uXEHVUgImpihSydMnJNATXEr3e0Wr6wb9LV0ym+4ccgx4aedRtytt/SOj7r0UqJXXYqtpYWq7//PcWOz/v28W+t6owHK9OnT+fnPf05TUxNhYWGsXbuW+fPnn3SNpduGUAm0of5Ritkz4igvaqKltpvYFM9C0k7EYTbTuGYNhsWnYFi00Ktz+5MZaZGsXn8JF+49h3QWkRJRw12v7HbWthECHA746Oeg0sDK33h9/Y0ljdzx3w+47IJuEr7M4FSrXjHr9IMrBj9Jn9Tv+YPv7QB05K4cWWbtYLR/+BFd32wk5YEHBhyTMyeRbe+XUVbYyNQlqR6vGfQK3x+42wBlKKZMmcK9997LypUrMRgMzJ49u7fGvgspJWajjZCw0TfnuMiaEQ8vH6JsT6PXFb5Qq2l6/AlUYfoxpfBTEjpA047jI4lUafjAyvHKVohjDVOkdD73IoWVbZy/uIlXS5/ibxOeomF9N3+9Om3EJZjHKkMlXZUfaMdgspO45DSvr20pK6N702YcZjOqkP7NRXFpBsJjQigvalIUPri/I+9vvCYmZtjXg3cboNx6663ceuutAPzsZz8jPf34OF+r2Y50SI971npCRGwocenhlO9pYu5K79bpFhoN+XsKEQM0DQlWttU6+5dOMadiooP8K+Yfr2iFgHP/eKxZipeV/urlOdR0XsXb5U9RzpfAHAx7ylh913leW2Ms4FL4CWEnV740tnXTZI8hN7rCJ9/PuNtvI/47tw86RghB1vQ4Dm2pw251oNZ6JkfQK3x/4K0GKAD19fUkJiZy9OhR3njjDTZt2nTceYvRmZDkT4UPTrPOjg+PYuqyej3Td6wpe4DtdduJU8djVKVgoI7HtulZnJd0vNJ3/b9byuH1W+HCv0OS95zXKeEpzE+az7ONH3ODfh71mmObCaXfrRO1Ss3kmMlo1Sd/p4vX7kQKNRMXeZ5s1R/u3rFnzYhn75fVVJe0kpEf69GaY+8vbRTwVgMUgMsuu4ypU6dy4YUX8uijj55kGrIY7WhD1Kh8XDtnKLJnxCMdkqP7mrw+d+PjT9C4Zo3X5/UnW6p3MmlPPnZNGLMLMgavjKlSg7kTTK1el2Nl9kpa7FXsVnVQvq8Zu82hxOT34faZt/PaRa/1e+7Itmq0lg4yzy/w2frV991H7W9/N+iY9MkxqDUqyvd4/ren7PBHgLcaoMDgdwJ2mwOb1e6V7D5PScyOJCxCS1lhE3kLkr06d/eWLdjb2ohfvdqr8/oLKSVTDRdyqlFNq7STc/489EmxvSUOTrKhR6XDdzf6xLxzVtZZ/GPHP5g+tQv7FgNP//V9/mUKVZy3Q+BwSGrb9SRpatBGDl0nf6TYW1oxbts+6BhtiJq0vGjKi5pYckWuR+t5ZYcvhDhHCHFQCFEshPhJP+dvFkI0CCF29Ty+7Y11xzouc44/wjFPRKUSZE2L4+jeJhx2h1fnVkdHY28bO7VehBA8euFd2LtiiXY0oE9y3oYPWhnTpex3vgCv3eKM4vEC8WHxrL96PTdddB7CYaNtV4VSMrkHKSU3fnAjbxw+ORS6auMBrOowMqf4tt9y6OTJWI4exWEevEha5vQ4Wuu6aa0fvITzUHis8IUQauBR4FxgKnCNEKI/Q+SrUsrZPY8nPV13PGAxObNrPXXUeIusGfGYu23UejnrVh0Vhb211atz+os160t4dfcmDleU0K5NJCPHMLwaNqZ2MLaAzeg1mbQqLTvbLGiM1cTq4rzaaSuYabe0s7N+J52Wk8tzH/nmCEgHOecPnBjlDXQ5E8HhwFJWPui4rOlxAJQXeWbW8YYmWQgUSylLpZQW4BXg4iGuURgCKSUWox1dmNpv4Zgnkjk1FpVaUFboXTu+OjoaR3v7mKiYOTM9it9u+j1/efsZAMzL5gzPXr74u3D966DzXvjr+sPVfOeza1HH12MMSeCvBUlKyWSgtsvZ6yHZcLKJskEmkpBuIDIv06cyhOQ47/gspYNvCKIT9UQn6TkaAAo/DejbG6yy57UTuUwIUSiEeE0IkTHQZEKI24UQ24QQ2xoavN/xJViwmu1+y64dCF2YhtTcaMr2eFdRqHsc1WOhYuaCCVFo9FVEHpmIDFHx408ODs9eLsQxJ+4r10Hxpx7LtL/ayKT4BHZn7QFAX3hEKZnMwArf1GWl7kg7WbP6T8byJrrsbBACc8nQfsCs6XFUHWrFaraPeL3RshW8C2RLKWcCHwPPDTRQSvm4lHK+lHJ+wgi6wo8VXPZ7bWjgKHxwfulaarvpaPZeBT91dE8BtZZWr83pLw61HMJuNZPTloC1qYTrF4/UXi6hrdL58JDVy3O4PP88Po/aSYi1jaOHOrzaaStYcSn8E0sjH/7vBqSEtAzf/+2pQkPRpqVhcSPwI2t6HHabg8qDLSNfb8RXHqMK6LtjT+95rRcpZZOU0uWVeBKY54V1xzRmow1dqMbv4ZgnkjHF6YCsPNDstTl7d/htrV6b01/sa9pHUkcmNo2B8KmJI7eXh0TAtz+FeTd5Ra6zss4ClQqNuoIGWyy2bucP9niukW/QGZiZMJO4sLjjXq+qsKJxmEmZ5nlmqzvociZidkPhp06KRhOiptyDO2xvKPytQK4QYoIQQgdcDbzTd4AQou9P6EWAdysRjTHsNgd2qwNdWOAVFItNNRAWqaNi/8h3GSfSWyJ5DDhuvziyk7T2WSDghu+fM3j8/VCoe3aYFVvgxSvAMvIIjUR9IpMip7PbUIhdHUrZhzvGfTz+BRMv4MXzXjyuNLKUkrruCLLmpaPWjc7ddciEiViOHEHaBzfVqLUq0ifHULF/5JstjxW+lNIG3Al8iFOR/0dKuVcI8WshxEU9w74vhNgrhNgNfB+42dN1xzK92bUBZs4BZ8hhRn4MlQeavdYURR0djQgLQw4RmhYMTNBcTEHLKSSmhREarqUgJ95ze3lXIzQfgW7PfCf/u2A12ecsRThsfPPRAaWYWj80H22js8VMxlTPMlqHQ9icORiWLBm0GYqLjCkxtDeaaGsYWRSXV2z4Usq1Uso8KWWOlPK3Pa/9Ukr5Ts/xT6WU06SUs6SUp0spD3hj3bHKaWcsQ6UWg4ZjGo1Gli9fjn2QXYHFYmHZsmXYvBz9kp4fi7HDSlP1yeFsI0GXmUn+zh1EnnOOV+bzJ6snT8TSFUaC5Wjvax7by/PPcyZmRXsWMbIsfRn/c/ZNhKjaqLPFj/t4/Kvfu5q/7/j7ca8dfOULAFLTR2+zFXn2SjIefQR1ZOSQY9Mne2ZSDYwAb4VepJS8/8bH6EIHr4759NNPs2rVqpOqa/ZFp9Nx5pln8uqrr3pVxoyeZBRvmnWCnTXrS3hn7x7ef+klECqyT5noXfu4RudMxvrkAdj29IineXdvEV/FmQhTh/PfjeM3Ht/usHOw+SCS4+9SK48YMVgaiZng+widE5FuJNvFpOjRR+lG7LhVFP4IKCoqoqDgWH2NHTt2cOaZZw57nq6uLs4//3xmzZrF9OnTefXVV7FZHWTlp6ANVVNWVsaUKVO47bbbmDZtGitXrsRodN7Kvfjii8cVbDv99NP5+OOPAbjvvvu46667ALjkkkt48cUXPfnvnkR4TCgxyXoqPbAlnkjtr39Ds5flHE1mpkfxyw/fou5AM2q7maqsdO/bx6UDaougbuC2eIOxsaSR+z59msqU/wLwi6kJ4zYev9HYiE3ajovQsXabaXLEkhLlvQg0dyldtYra+x8YcpzTpBpL5YGWEZlUA89IPAy+/M8hGiu8Y1ZwEZ8RztIr8wYdM3XqVEpLS7Hb7ajVau6+++6T6uu4Ux553bp1pKam8v777wPQ1taG1XS8/f7w4cO8/PLLPPHEE1x55ZW8/vrrXHnllZSWlpKdnd07769+9St++ctfUl9fz86dO3nnHafffPr06WzdunVkb8YgpE+JZf9X1V4p2QpgKTuCyuDdWvujSUFOPEummQgrnIJO1nPX60Xet4+rNXD1i6DWjejywso2frr8cn6/YzVquwm+KeKRO88ZlzXya7tPjsEv/3Q3DpWWzNmjv7uPWLECXbp7VTnT82M4uLmWxqpOEjIihrVOUCt8f6FSqZg2bRp79+7l8OHDZGVlMXfu3OPGuFMeecaMGfzwhz/k3nvv5YILLmDp0qW01ncjALXGqUQnTJjQW5lz3rx5lJWV0djYeFJVzWXLliGl5KGHHuKLL77oNfWo1Wp0Oh0dHR1ERAzvyzEYGfkx7Pm8kprSNtIne15vJPPpkZspAgV7XQWW0DOp6zzgO/u4pqeQXlsVvP9DuPBhiHBPQa1enoOUE3nqcBJ2Qy2N2omclxM/7pQ9QHVnNQCphmOhl0e3liFkDFlnj37UeML3vuf22PR8599b5YGW8aXwh9qJ+5LFixfz9ddf889//pN169addN6dHX5eXh47duxg7dq13HfffZxxxhl871t3Qx/TfUifTjhqtRqj0UhYWBgm0/G3nXv27KGmpoa4uLiTFLvZbCY0NNST/+5JpOXFIFSCyv3NXlH4wY7dYSei0PnBJc3L4l+bj7I4J853yrS7Eap3QnOJ2wofnCaBBNVcNiXvYXFZNh3NJiJiQ8ddffzY0FhWZK4gNfyYwq+psRPlaECfPPo/gFJK7E1NqGNihuzv3GtSPdDMnLOG58hXbPgjZPHixdx3331ceumlpKWdXEniyy+/ZNeuXSc9+na7qq6uRq/Xc/311/OjH/2I7dt2uNUoPCYmBrvd3qv0a2pquO6663j77bcJDw8/7geoqamJ+Ph4tFrvNi3RhWlIyo70KCa4L03PPMvRW4O3iOr7+/eR3jwBtd3Et767wrP4e3dImQX/sxuyhl+r/YzM06mIcPoBjnxWNC7j8RelLOKvp/8VvVYPgLm5nTYRT3L/nQ59Ttsbb3J4yVKs1dVujU/Pj6X6cCt22/CqqioKf4Tk5+cTEhLCvffeO+I59uzZw8KFC5k9eza/+tWv+NHd7s+1cuVKvvrqK7q7u1m1ahV/+ctfmDJlCr/4xS/41a9+1Tvu888/5/zzzx+xjIORMSWG+qMdmLqsHs9lb26ia8sWt37wApHqRj0RTCVWNKMJDfFO/P1QaHvu2va8Bp/+2u3Lbpp7Jj89/RE01k52f1A4LuPxrY7jv7NlH+5AqtRkzvdtsbSB0PZsGq2V7pXSSM+PwWZxUHdkeN8vReGPkIcffpjf//73GDxwNJ599tkUFhaya9cutm7dyvQps9Do1HR2Oh3R2dnZFBUV9Y6/5557eKCnw/0dd9zBc889h16v55tvvuGss84CnLb8b775pveal156ie985zsjlnEw0qfEgoSqQ56HZ6pj48BqxRGkBdSuz42mWxdPSsYxE9yo1aup2AxHN4HNvcQ1rUrL2VNzCaOJbhnL9QvSx5WyB7j8ncv5xde/6H1+dGclwmEjc+XcQa7yHboMp8PWUlExxEgnaXnRCDH80GhF4Q+TkpIS8vPzMRqN3HSTd+qcgLPDjtVsRxfqXjmFuXPncvrppw+ZeHXJJZeQl+cbX0dSdiQanYqqQ60ez6WJcyaU2Jq830JxNHhx04cA5KxaMvqLn/17uOHNYw5dN3izaBfFIXuw6SLZ/NGucRWaKaWkqrOKKN0xE1ZzWBbxcYKQCL1fZNIkJ4NGg7WyaujBQIheS2J2JJUHFIXvU3Jycjhw4ABPPfWUV+d1lTwdTnXMW265ZcjEqxtvvNFj2QZCrVGRkhNFtbd2+IC92Xux/aPBmvUlbCxppGR/LQ6NjeT8pNEvSKbWOJW9pRve/C7U7R10+MaSRn791lF2T9gFwI0RqnEVj99kasJsN/c6bM1GG031VrJO8Z/DWqjVaFNS3DbpgLPXbV1Ze28pFndQFH6AYDXZQDj7VwYTqXkxNFV1Yey0eDRPsO7wZ6ZHccfLm8g6kkRoaCObypr95wA1tcKR9VC5bdBhhZVtPHpNAXEzs9GZmzDXW8dVfXxXSGZauNNuXv55kbMcco73wpZHgi4jHcswFH5afgzSIakpcf9zUxR+gGAx2dHq1AFXDnko0nKjAag+3OrRPMG6wy/IieeepXrQpOAw1/vXARqZCndsGbKk8urlORTkxLMsbRlmDtJgjWZRZvS4CcnsjcHv2eGXfVaEymElacLQtWx8iTYtfVg7/OSJUajUgurD7t9hB6XCD9ZIjoFwOCQ2i31Um5146z1MzI5Eo1VR7aEdXxMTDQTfDh9AdDjLFj9rSPJ/QbKQcOe/1Tvh3R+AY2Afz7KMZVREH8Km0VP9VdGA48Ya6RHpXD/l+t4dfkt0LkmZBrR6930gvkCbkYG9udmtqpkAWp2apOzIYfnQgk7hh4aG0tTUNKaUfm85hVEy50gpaWpq8koyllqjIjknymPHrdDpUEVFYW8Krh0+QM1BCxaVmcuWzwycBuEVW53tETvrBhzy4U4HlpnOpLmj3zh9DuOhIcr0+Oncu/Be9Fo9pi4rjVVdZMzpryvr6KJLd8pgcdNxC5CaG019eQcWk3t2/KDLtE1PT6eyspKx1O/W3G3FYrIT3hUyag3LQ0NDSXezdsdQpOXFsPmdUkydVkLDR57gpZ8zB3Xs6NUh9wYbSxqJ2GPDENnNdedOoyAvKTDi2hfdDrOuhtCBzRSzMqJ54ssLmGFpprba1puA9ci1c0ZR0NGnvrue6JBodGodpe9tBgkpGd7NRB8JoTNnknjPD3s7wLlDWl4M29eVU1vSRua0uCHHB53C12q1TJgwwd9ieJX/PrgNtUaw6p6p/hZlRKTlRQNOO/7EOSPvQ5yx5l9ekmj02LejFGtoPFmJzjuTvglXfo9tD40EKWH9HyFtHuSuOO60S9bX/rGJCTY9v3txJ49cN/YTsL790beZFD2Jh057iKNbylDZ40me5P+Nhi49nbhvDy/bPDknCpVKUHW41S2FH3QmnbGGxWSj4WgHqT3Oz2DEZcf3RgJWsDGnuR6AzknHahsFVINwqxH2vwuHTq73BLBwQjQVGe+issH1k5PHvLJ3SAdVHVW99vu6Fi2xqmY0frbfu7BWVWGtct+kow1Rk5gd4XZotKLw/UxNSRvSIUnLDd4CZN6y4zc9/QxHrrrKO0KNEkf31qG2GVHND1BFqdPDze/BeX/q9/SWI61Uq5whtW0fbQ4M/4MPqe+ux+KwkBGRQUd5LZ26BFLSR1Zu2heUXX8DDX//x7CuSc2Lob6sozeXZzAUhe9nqg+1olIJknOCu3BVWl4MTVWdmDpHXldHHRODLj0j4B3yrmQrgJbOcIS1hHZjfOA6O8OiQQjoqIN37gKLMwrEZbO/aOFy1JY6JkREjfkErIoOZ+mC9Ih0yj7eDUDWosAxESf/4hfEXH/dsK5Jy43G4ZDUuhGPryh8P1N1qIXE7IigS7g6kb52/JESfeklpP3lz6PmuB4pM9OdinHD+n0YdQk06Yv57VsNgV9tsnYPFL3Zm4lbWNnGI9fO4ebZ57InvYRORzT/uHr2mE7AquxwxrlnRGRQsbcBtd1M2vIZfpbqGBFnnE7YjOHJk5wThVAJt0yqisL3I1aznYbyDlLzgtec42I82fFdzs61//4KgP0JdTx67YLAt3/nroAfFELGQuBYAlaSIQlSu8GiJlejDRz/gw+YET+DH877IcmGZOrbQ4hVNaEJCRyTjrW6mo5PPx3WXa4uVENiVoRbmy1F4fuR2pI2HA7Zm60azHjDjm8sLOTggoV0bdzoPcF8REFOPNOEBrXNiG3KhMBX9i70PdEo+96B7c/2vnxDwXkAHH75Uz8INXpMipnEzdNvxljWQJc2jtQACMfsS/uHH1F5x53DrhqblhdNXVk7VsvgdnxF4fuRqkMtiDFgv3fhqR1fFR6Oo6MDWxAkX20sacRkDUdvb+Rg8ZnBZfeWEna/DLte7s3E3dWSQpiliZqjxt5hYzEJa0/DHuq76yn7tBCAzACy3wNok53dy2x1AyfM9UdqXgwOu6S2dHBznKLw/Uj14VYSsyJ6G5YHO57a8TU9SVf25sAur7CxpJEfPb8DS2g8eQszfN/dytsIAauegBvfApXTdzQzPYpuaw2NthjsVtuY7YK1+pPVPLb7MWrrQe0wk7Zspr9FOg5NklPhW2uHp/BTeuz4Q5U4URS+n7Ba7NSVtQd1/P2JeGrHV0VGgkaDrTGwFWdhZRs/WzARgN+rHycpri34qk2GhIM2zNk0Zd3PKEi0Yc2ow64J48l/fhgY2cJeps3cRrulnYyIDBqt0aTNSEEd4t3Wn56iTXLt8GuHdZ0uVENCZsSQf3uKwvcTtaVtOOyStDHgsHXhqR1fqFRoEhKw1Qd22YzVy3MIKakFrZ0juv3Eh8UHVrLVcGg+Ajueg+JPyT97NgB1O/b7vwicD6jsdEbopMg0Wmq7A/JvT5OQAEIMe4cPzvDMuiPtg45RFL6fqD7UihDOW7GxRFpetEd2fE1iAraGei9L5X0qCmsxdJUSFRpJVEgQf4aJ+fD9nTDnOrTJC9CZ60gT4YFTBM6LuGLwQzc4fUQJ4cbBhvsFodOhjo8b9g4fIDUvGod98Ogeryh8IcQ5QoiDQohiIcRP+jkfIoR4tef8ZiFEtjfWDWaqDrWQkBmBLmxs2O9duEJMR2rH1yYmYa0PTIXvSrjqajXTrY2lamIjMbrU4HdshieysaSRJ179GDiCVZPBP66YEVx+CTd4fbcz0cpsS0aNjZR5EwLSMa1NTBrRDj91krPP7WB4rPCFEGrgUeBcYCpwjRDixCpgtwItUspJwF+BP3i6bjBjc9nvA/CW0lOSsnrs+MNoytAXTWJiwJp0XAlXn391FIAtiXspq9WPCcdmYWUbD+UfJNywD7smjOSKo8HnlxiCCyedh7rhZioatKROTWRLVUdAOqY1ycnDjtIB0IU57fiD4Y0d/kKgWEpZKqW0AK8AF58w5mLguZ7j14AzhRvplDaLwwviBR61R9px2MZG/P2JqLUqkiaO3I6vSUzE0d6Owxh4t9uuhKvdb28D4aDcFM+35543Jmzdq5fnkHb5H1h52w8BqN1yNHj9EgNw0bQZ/H35KkyNJo5gDVjHtDYpCWvt8E06wJCbSG8o/DSgos/zyp7X+h0jpbQBbUC/tTyFELcLIbYJIba1NI2d3UVfqg+1OO33kwJrZ+Eteu34XcO344fNmE7UZauQFs965PqKgpx4km0aVB3l3Jh/B99ffIW/RfIeKjVxs+YQEWKhqcsBtWOrC9a7Je+i3rEDgE1FewLWMR1z3bVkPPrIiGpKuUKjByLgnLZSysellPOllPN16sDKgvMWVYdaic+IIEQfWCFh3iI1Nxok1BS3DvtaQ0EBqb/9LeqowPwxXP95EaaQOPTxgn9vKR5TNm4X9lwrpW0GTDue97coXqPd0s7PvvoZh3dWorJbWHjRgoB1TIfk5KBfsGBENaWyZwz+A+YNhV8FZPR5nt7zWr9jhBAaIAoYMrvGarbjcAR25cThYrPaqTvSTuoQv8TBTNKESNQaFVUjdNxKKZHWkVfd9BUbSxr58MWvAVDPbcee8VPuePmbgFQaI2XN+hLMsQKtPYyv1cuAsZFxW95WDoDVGE+ko5H/vWBGwCbM2VpaaHv3PZ8EL3hD4W8FcoUQE4QQOuBq4J0TxrwD3NRzfDnwmXTjfsXhkDRVdnpBxMCh7kg7dpsjIGOAvYVGqyZpQuSIGpvbOzs5OHMWzS+86H3BPKSwso25uhA0NiPF2U3EhMbw6DWnjCnH5sz0KN4udJZPrvxkL1v2HqTohXuZmRruZ8k8o6y9jJiOMCyhSaSlO++s+3YnCySslZVU/+hHmIr2en1ujxV+j03+TuBDYD/wHynlXiHEr4UQF/UMewqIE0IUA3cDJ4VuDsRYq75YdagVBKSOUfu9i9S8aBorOjAb3Wuu7EJlMBB7882EzZjuI8lGzurlOXSYw4nTtFDWXUF2ZPaYc2wW5MTzi9vOpFvVxGFVNB+89gzfFu9QED4yJ2KgUN5ezrzyHBAqMudn9b4eiJ9fSF4eE9e+j6HgFK/P7RUbvpRyrZQyT0qZI6X8bc9rv5RSvtNzbJJSXiGlnCSlXCilLHVnXmeafqs3RAwYqg+1EJ8ePmbt9y7S8mKQI7DjCyFI/OHd6OfP941gHtB6qIJubSwpWWEcbT9KZmSmv0XyCQU58XSnQmxnOo55K1HdtRVSZvlbLI8oay8jt3UKKoeV9DNm+1ucQVGFhBAycSKqUO/7MAPOadsXbYiamuLWMWPHt1nt1Ja2j2lzjovkCZGoNGJEP9j2zi6s1dXeF8pDyj7dA0DKokwajA1kRGQMcUVwsrGkkUPtDkLsYRz+vJSNzT3mnEMfweFP/CvcMHEly/180c8x2HOJkY1sq+0MeJ9Ey6v/oeOzz7w+b2Ar/FA15m4bTVVjw45fX+ay30f7WxSfo9GpScqOdLu5cl9qf/kLyr/1LR9I5RlVB5rQ2IwkLJ7MvQvu5dS0U/0tktdxVcn8zvnOrkvXhOidjs3ievjid/DVX53llYMEV7JcUWETndoEwqJlQCZbnUjzs8/S9vaJrlDPCWiFrwtxlh0YifMvEHHZ71MmRftblFEhLS+GhopOLKbh2fE1Cc5s20DrbdtgjiJe20qEPpLrp17PtLhp/hbJ67jaHi5bPhWDtYnOBgt/viqfwqoOuOZVuPZVhszfDyAKcuJ58IqJvP7CUyBUrOuyBWSy1Ylo4uKwNXk/eiigFb5KI4hMCBszjtuqHvt9qGFs2+9dpOZGIx2SGjeaK/dFk5SENBpxdAbOnV1ni4kuwslZtYSazhrK28sD7gfJG7jaHgJE6Ntokwk41Pudjs2IJGdZZbsV1v+ptxl6oBMV1YgxRoUDB5PPmRvwyh5AnRCPvWGcKXxwlvysPtyKDHI7vt3qcNrvc8e+/d5F8sQoVCoxbLOOJjERGH7XH1/i8kWkTY7l+X3Pc+W7V/pXoFFg4oxU7Jow9n781fEnqrY7zTsHP/CPYMPkk+JCkjtzscdpeH53XcDF3feHJi4eW5P3GwEFvsLPi3ba8asDZ7c3EurK2rFbHWM64epEtCFqErMjh+241aYkA2CtqfGBVCOj+D+fo8VCXHo4lR2VpEekjygTMlhYs76EjsnZAFj3dCOlPJaAlbkY7tgCMy73r5BusLGkkXWbtpHQmc7CvMiATbY6EU18HI7OThxms1fnDXiF7yoGFOzhmVWHWpzx92OwYNpgpOZF01DeMSw7vjbNWYrJWhU4kTqNthjiw7pQqQSVnZWkhZ9YLmpsMTM9ih9sqCLU3EBEZyb/Kdx8vLMzPtf5b8Mh2P2q/wQdgsLKNpaaQxFCRUJEd8AmW52IJt5pdrJ7uftbwCv8iNhQIuNDg95xW3WodVzZ712k5UbjcAzdXLkvmoQE0GiwVp1YocM/dLaY6DTrmHj+AqSUvTv8sYxLMRptzUhtDn/49I3+nZ0b/gSf3A/mwLwDX708h251ElLlIOtsZ25HICZbnYg6zllb0tvtPgNe4YNzVxzMdnyn/b5t3O3uAZLdbK7cF6FWo01JCZhY/IpdTjnSJsfQZGrCZDeRHj62FT44FWN4dgx2TRi3iyX9Ozsv+Cvc+pHTmRugnCrOIik7Cp0heIoxunb43rbjB4XCT8uLwdRlpbkmOKICTqSu3Gm/Hw8JVyeiC9WQmBUx7A5Y2tTUgFH4JW99jcZuJC7VgF6j56HTHmJp2lJ/i+VzNpY08opVB8DR/W39271DwiG6J+N4+3PQHhh+F1fClbm5nYYjbSQbjEFVBK5X4Y/XHT4Eb12d6nFqv3eRmhtNXVk7Vovd7Wtirr+O2Buu96FU7lPfqSde04JKrUKv1XNW1llkRI7NLFsXrgSsX962jKikUGJS9XzvjRcHdna2V8O6n8LmNaMr6AC4Eq5efeYlpFDRpWoLioQrF5rERCZ99inRl1zi1XmDQuFHxocRERu8dvyqQ63EpY0/+72LtLwYHPbh2fEjzzqLyPPO86FU7tGyrwyjNoaULD0A+5v2s6Vmi5+l8j2uBKyCnHjS8mLRNuiZm186sLMzMhW+/Qmc+cvRFXQAXD6IxqImhMPO/1URFAlXLoRajTY1FaHTeXXeoFD44AzPrDrcGnTJLnabg9qStjHZztBdUnrs+FUH3b9DcxiNGIv2Yu/0rxmvtKd+TvbSyQC8dOAlfvKl28Veg5a+CViJYR1o7SFod1dy29LsgS9KmgoqNRhbYNvToyPoIBTkxBPpSEFjrmDVsrygUfYuWv7zH1pff8OrcwaNwk/Ni8bUGXx2/Pqydmzj1H7vQhfmtONXHnBf4Rt3F1J2+eWY9hT6ULKhqTzYitbWSfLiKQBUd1aTGp7qV5lGm4zZzhDUkK40djXsGvqCrU/B2h9DY7FvBRuCL3eUYQlJxxZSF7DdrQaj7e13aP9wnVfnDBqF71KYw9klBgKu/IHxar93kZ4fQ315BxY36+OHTskn/ZF/EJKf72PJBsbhcNBgjCAxpB2V2vmnUt1ZTaph/Cj8NetLKJI6opJCCSOPLyq+GNr5ueR/4fbPIX7SqMl5IhtLGnntibVIlYbYWfqgSbjqS9Zzz5L5+ONenTNoFH5kfBiR8aHD2iUGAlWHWohLMxAaPj7t9y7S82ORDul2tI46KoqIFSvQxPjvzqhh60HM2kjScp2OPod0UNtdO652+C7npzZZT3p7LtUNXUM7P1VqSHZW26T0C6jdMyqy9qWwso0CjQbhsJK5ck7QJFz1RWg0Xp8zaBQ+OJVG1aFWHHaHv0VxC5vFTk1xG+n5sf4Wxe8kT4xErVUN6we7e/t2urb4z0Fatn4/ABPOcFbFbOhuwOawjSuF71KUW3ftQGXX0rx2gvvOT5sF3vk+fPKAz+U8kdXLczB3RxErGynIdfbmDYaEq750fPYZVT/+sVf9lkGm8GOwGG3UH+3wtyhuUVPSht3mID1//NrvXWi0alJyoqg82Oz2NfUP/ZXGfzziQ6kGp+pIF6HWNuJmTAAgJjSGl857idMzTvebTP6gICee7GVOH8YZKjuzM/XuXajRwXWvweWj78DtOFpPhzaB1LTgvbO2HDlC+zvv4ujq9tqcwaXwJzsVZ+X+4DDrVB5oRqUS495+7yI9P4amqi662y1ujdempWKpqvSxVP0jHZLmkAzS82N6i6Tp1DpmJMwgQZ/gF5n8xcaSRp4u7STU3Eh3SzfXvner+xcn5EFoFNhtsP1ZcLifizESXAlXlQecGaolWZVBlXDVF3W0U9/ZW1u9NmdQKfywCB3xGeHD2iX6k4r9LSRNjEQX6n1bXDCSPtlp2nLX8a7LysJWU4vDZPKlWP3SWNmJ2eQge9kxp/GOuh28VfxW0IUGe4IrAeuRa+eQEmNB6rIpa97HhweGGYFz+CN493+c//oQl89hZ7ERi9rIvnRzUCVc9UXd47+yt3hvgxtUCh+cdvyakrZhZW36A1OnlYaKDjKmKPZ7FwmZ4ejCNFQecO8HW5edDVJiOXrUt4L1Q8kHOwCOa0f5Xul7/GXbX8Z0WeQT6ZuAlT41AbsmlJkVaawtHma/1fzz4JaPYPK5vhG0B5fPobKojurIYj4uVAdVwlVf1NHRANhbx7XCj8Fhk9QUt/pblEGpPNgCEsVh2weVWkVqbrTzvXEDXXY2AJayMt8JNQAVO6swWJsJjzlWcKu6q5oUQ8qoy+JP+iZgZa+YCcDshmmg3zv8yTIXOf9tLnVG7/iIycZODI4Q9J0HuSh/XlAqewB1TDQwjk06AKmTolGpRcCHZ1YeaEYbqiYxO8LfogQU6fkxtDeaaG80DjlWl5UNgKWs3MdSHY/d5qBZl0pWwfERHTWdNeMqQudEIrNTMFibiDXm8U3NN5hsIzS1vf9DeOcuZxSPD9i4xxl6uSejhHd3WIMq9r4vvTv88WzS0YaoSZ4YFfAKv+JAC2l5MajVQfcW+xRXxJI7u3x1uAFNQsKo7/Dry9qxWRxkzj3W5ERKSU1Xzbjb4fdlzfoSIvTdGNXp3DfrpwghRuYQvfifcMNbzigeL7OxpJHPtzTgCLUx89RTePTa+UGXcOVCHRkJKhW28azwwak0Gio6MHVa/S1Kv7Q3GmlvMCrhmP0Qm2JAH6lz+wdbl52N5cgRH0t1PAdf+QKQx0VXtZpbMdqM43qHPzM9iq8sVhzqEKYcjGd7WcfIHKKRKRDXc/e09y2vNk/ZfbSFyVZJXl48D5z6QFAmXLkQajXqqKjxbdIBnI5Q6d4u0R+4lFmGYr8/CSEE6VNiqNjf7FZDG1129qjv8CtLjcTYGwgLP7YDjQ6J5rMrPuOinItGVZZAoiAnnlWrz8IhHbx32Mp3332Yh6+eMXIbeeNheO1bsOlfXpPxYp0Fm01NrPVYOG+wJVz1RRMfj7R6b2MblAo/MSsCbaiaCjejPUabigPN6KN0xKS4maAyzsicGoep00p9+dAJdHG330bWSy+OWihke2kVbdoE0jKOD6UVQpCgTyAqJPjC+7zJ0jlZkBhGe2U3jpi3UBtKRz5ZfC7c9K6z9o6XOPK5Mzv6/+x/paKjwmvz+osJ77xN6v/9n9fm80jhCyFihRAfCyEO9/zbrw1DCGEXQuzqebzjyZrgjPZInxxDxd7mgIuJlg5J5YEWMvJjx1X43nDInBYLAsr3Dt2+TZeRQciECaP2Xpa8vx2EionLjy/atrlmM2t2r8FqD0wz4mixsaSRos4W4m16UhtjeWHPu55NmL0E1BowtcPBD0Y0hSvZCqCi3EyouZaqhE7e3T50YECg4+3vvac7/J8An0opc4FPe573h1FKObvn4ZV74qzpcXQ0m2ip8V7asTdw+RYypij2+4EIC9eRmBXJUTcUvsNopPnfL2AsHJ0yyUf3t6C1dZG2ZOpxr39V9RVPFD6BRjV+k+hcSVhXL3U22F7RvJwvq77gq+I6zydf/wf4z00japHoSrb6cvsRmkUCJl0xlu5UZmcEv0m19Y03qf7pz7w2n6cK/2LguZ7j54BLPJzPbTKnOb90ZUWB5X0vK2wEcUw+hf7Jmh5HXVk7xs7BQ/OEWk3dgw/S+eWXPpfJYbZQZ44h2dDRWw7ZRW1XLUmGpHF91+ZKwlp+ySL0ERoSE5aBupMPi7/xfPLTfgo3vuV06A4Tl2P27cc+Qao07IrbxRkT5wZt/H1fbA0NmA8f9tp8nir8JCml6ye5FkgaYFyoEGKbEGKTEOKSwSYUQtzeM3ZbQ0PDgOMiYkOJSwvnaJF3u7p7SnlRE8kTIgmL8H7I2Vgia1ocSKjYN7gfRuh05G5YT/z3vudzmSo/3YFVG07mjJNr5dR115FsSPa5DIGMKwlLpVKRNSMBS7kWgzqcvEwvFDMMCYesAufx0U3OHrnDoCAnnllSjcpmYtvEYlbmLPBcpgAg/ju3M+G1/3ptviEVvhDiEyFEUT+Pi/uOk05j+kAG9Swp5XzgWuBvQogBXeZSysellPOllPMTEgYvUpU1PY6a4jbMbjbV8DVdbWbqyzvImh78Owtfk5gVQWi41i07viYublR21qVfFYN0MOmC+Sedq+2qJVk/vhW+izXrSzCrOrAY7Twf+xdumHqD9wqUmTvh5Wvgw+GZMb4+XI/RHoPeUYOj6xwcpmzPZRmDDKnwpZQrpJTT+3m8DdQJIVIAev6tH2COqp5/S4EvgDneED5rRhwOhxxylzhalPfcbWTNUMw5QyFUgsypsRzdO3R4pnHXLqru+RH2Dt+Wxa6qhShHM+HJx/tfHNJBi6mFJMNAN7Dji5npUfxxXw1IB1Ubna0D73hph3cKlIWEw9UvwfkPuX3JxpJG/vnox1h1UUyfnci/Lvgxv3y9KiiTrU7EWFhI2VVXYzp4yCvzeWrSeQe4qef4JuDtEwcIIWKEECE9x/HAqcA+D9cFIHlCJCF6DeUBYscvL2rCEB1CfHq4v0UJCjKnuReeaWttpf299zAfPOgzWYwdJlp1KWTknvzZqYSKzddtZvWs1T5bP5goyInnt7eeiq67hrJKB6s/voPTT9niPZt51imgjwWHAw6sHXJ4YWUbV8UZAOhaoGZ6hi5ok61ORNrsGHfvxlbvBcc4niv8B4GzhBCHgRU9zxFCzBdCPNkzZgqwTQixG/gceFBK6RWFr1KryJwaS3lRk1tJPL7EbnNQsa+ZrBmjY34YC7gbnhna09fW5EOFX3mwDRBMvvzUfs+rhIoQdYjP1g82CnLiCY2y0R2SyHTC2d3yOQ7p5U50u1+CV66Bsq/6Pe0Kx1y9PAdbWAbRKTruOHQvP173VFAnW/XlWMXMVq/M55HCl1I2SSnPlFLm9ph+mnte3yal/HbP8UYp5Qwp5ayef5/yhuAusmbEY+xwliL2J9WHW7Ga7WRPV8w57uJueKYmKQl1VBTmA75T+Ec2lRGi15CYdXKxu531O3lg4wM0GQMrQMCfbCxp5FOVBoSKCTtzqO+uZ2vtVu8uMusauOpFyOr/R9gVjrlhby21pe00J7QCsCxzbDhsAdRRkQDY29q9Ml9QZtr2JXOqc5dYtse/f4zle5pQa1RKOeRh4k54phCCkPx8n+3wbd1GynbWkUjdSeGYAEWNRbx++HXUQu2T9YMNVzz+bXedTYi1nemONHCE8NSu17y7kEoNUy4AIaD1KNQdX5LZFY757sPvIR2Szxu+QqcK5YqZi7wrhx9RRzoVvqNDUfiAswtWUnZkr8PUX5QVNZI2ORptiKIUhkP2DGd4ZlnhUGadyZgPHULavd/4pq68E6s2nEmnTer3fG1XLaHq0HFfVsGFKx7/1NxEUiM7aSORZdGnsa3hC4w2H2S3SulMynrtVqddvw8FOfHkRiYibEbaJuxnduJMtKrg7WN7IkKrRej1yg6/L1nT46gvb3e7V6q3aa3rpq3eqIRjjoCEzAjCY0Io3TVwzgVAyOR8pMmEpdz73a/K9rWhUgsmnTWj3/O1XbUkG5IV30wPrnj8NetL0ObGYVeHcGXTAr4/9w6+KWnwfv9YIeCif8AVz4LqeJX19aEGOroMWLKjqHeUkaCd7N21AwB1RAT2dkXh9zJxdgJIhlQavuJIoTNKKFsJxxw2QggmzE6gYn8zVvPAu/fQadMAMO3xbokFh8VC8YYS0rL16ML6L5tQ211Lkl4JyTyRmelR/KJOorab6Cyykhd2Aff856Bv+scmT4fEnvpGpV+Aw87Gkkb++uQmQqXggvPy+OXcJ/lwU/aYCMfsizoyUjHp9CU21UBUQhilO/tNA/A5pTvric8IJzI+zC/rBzsTZydgtzo4um9gs07IpBxU4eF079jp1bWrP9lKp1lLauTATn+BID0i3avrjgUKcuJ56MaFdNtbKLckcudLm7l+RSOTU314J1S1HZ6/GLY9TWFlG9cYm1E5LGROjuKKmQt49KozxkQ4Zl9UUZGKSacvQghy5iZQdbAVU9foVjPsbDFRW9pOzpzEUV13LJE6KYoQg2bQOzShVmM49VSnPdeLHPrkAEgHky8eOLLjhfNe4IGCB7y67lihICce1ZKpSIeGSzJDeObQ7/jgyMiqXrpF2jy4/GmYexO3n5pNS3cUSepG1hx8jK21W8dMOGZfQnJz0aZ4J8t7TCh8gIlzEnE4pLN42ShSstOppHLmDl4GQmFgVGoVE2bGU1bYhN06cCx3+sN/I+XXv/LautJi4WhTGHGaViKSFYfsSNhY0shLFY1IFZg3t5NhyOXdUg9LJg/BmqbZbCxvp+LDTZi1kSTlh/LEnid4cssGn67rL1Luv5/UP/zBK3ONGYWfmOV0/pXsGF2zTsmOemJTDcQkG0Z13bHGpPlJWIy2Qc06LrzVA6Hy/a/oCksmZ9bAvpfilmJWf7KaA80HvLLmWMIVnvm36+eQKqvJNqupKZ/CvqZ9lLR62XHbB1f8fdEbGxAOGzuynX/zZwwQr69wjDGj8IUQ5MxL5Oi+5lEz63S1makpaSNnjrK795T0/BhCDVoObxv4B1va7Ry54koa//GIV9Y8+NlhkA6mXrZwwDFHO47yddXX2B3eDwcNdlzhmQU58Uw+dxoWbQS/nHk1KjS8dsjLMfl9KMiJ5x9XzKBKTiHKUs4TVZuJ0EZzxcyBP8dgpvWNNym95FKkzfMikWNG4QNMXpiMwy5HbZd/eGsdSMhdoERweIparSJnbgJHdjcMGK0j1GpCp09Dm5Hh8Xr2zk4q2iOJ17VjiBv47qy+2/ldStQrPpoTcYVnAmzQhyM0gtgGHSuyzuBQyyG+LvZBiGYPSftLseoi2YoNbfghTo+fjsoSWM2QvIXKYECbmoq0eB52PqYUfnxGONFJeg5t8U6hoaE4uLmWxKwIxZzjJXLnJ2GzOCjbM7AfJuX++4m+9BKP1yr/z8d0hyWRuyh10HH13fWohZrYUCWDejBmTYihRnZyYMMR7p97H7fkPMhdL+/yTYgmsOvjw6jsZuIunITNquG0PR/Ax7/wyVr+JvLslWT881FUes97ZI8phS+EIG9hEtXFrXQ0m3y6VlN1J40VneQtUmqke4uU3GgMUToObq4ddJy9sxNrvWd3cfs3HEVIG1MumTvouPrueuLC4lCrlAzqwSjIiWfpNDU2dLz+0Mfc9fIu/nxVvk+6Tn1VVEmjOZZYdT2/uOws/rn8DdZ13cLW7O94fa2xxphS+AB5C5NA9phbfMihLXUIlSB3vmLO8RYqlWDy4hSOFjXR1Wbud4y02ylZcRaNjzw64nWs3SaqwyaTnmAjLHzwzmSRIZHMiO8/A1fheM689Sy01k5Mh9s5Y3YbP9l6Gfub9nttfld1zJL3dmDXGph1WhZfFdexp6qdy677HtubtM6w3cptXlszEDDuKeLQqUvo2rTZ47nGnMKPStCTMimKfV9Xey2a40QcdgcHN9WSMSUWfaTSytCbTClIQUo4uKn/Xb5Qq9EvXEjnF1+M+POtONSBReqYeeXQTr4fL/gxfzv9byNaZ7yxubINo6Uaachk5yYbDgkv7H/Ba/O7onMEyRgi1OzK1fLdDRcTGlF2LP5+82Pw1FlQMzpN70cDEaLD3tSEvbXF47nGnMIHmLYklbZ6I9WHWn0yf3lRE12tZqYtGdz+qzB8opP0JE+M4sA3NQMq9PDTTsNWX49p3/DbKtg7Otj70SHCInVkTFPs8t7CFaI586KZSJWG/xUSa+s83i9dS6PRO7kxBTnxPHTBNNrLOmhL1fP7r/+DSm3kwimzjw2aewNc+DAkj527MlfFTG9k245JhZ8zNxFdmIa9Xw2vEbK77P2yGn2UjqyZSu0cXzDl1BRaarupKek/RT58+TIQgs7PPh/23FX/fp2jJUZyp4Sh7qcUcl9MNhOXvn0pa0uH7ro03nGFaB5MTCLSUktDjZb7l92GXdr50zdPey1aR7y7EYHg2apqQmN2syR9CXFhff4OdQaYe6Oz4Fp7jfMR5PQq/HbPS0aMSYWv0amZvDCJ0p0NmDq9G5Pf3mSkfG8TU09NHVJhKIyM3PlJhOg17Pmist/zmrg49AsX0vbWW0jH8LosVcYvAiGYdeHUIcc2dDdQ3FqM1TG65TqCEVeI5sz0KA6KDrq1scwo7mZ23BLWlr1Gfkqox2vY7Q4O1UWg6q7izOUWuh1NTDac1v9ghx3+fQm8fqvXy3GMNiIsDLRaHO2eN3kasxpr2vI07DYHRRuqvDrv3i+ddw1TTk3x6rwKx9CGqJlyaiolOxrobOk/2irm6quwVlXR9fXXbs9rtzo4sLWR7JkJbhW6q+t2Ov4T9EpinbsU5MRzzg/OQ2Pt4pv3DlO051R+Of8RTstLG9F8LkctwLoPSrHYtajOnU2Z+UvC1Aae+djQf3VMlRrO+T2c86Bztx/ECCFQR0Z6pUTymFX4canhZE6LpfCLykHrswwHi8nG3g1V5MxOIDJOqYzpS2YsTwMpB/zBjjjzTNRxcbS88qpb89k7u9h0+28wdliZeZp7lS9dSVdKaeThsWRGBnpdAx3aDG5PSO3NgB2Jk93lqN1Y0kjF50cgXMNjh2u5OOcyfnHKz3n02oUDV8fMOQNSZjqPg9yJ66yJr5h0BmX2ikyM7RYObhk8rttd9n1VjbnbxuyVmV6ZT2FgIuPDyJ4ZT9GGKiymk1PKhU5H9GWX0fn551irh/bVND75JIdsk4iJVZOeH+OWDA1GZ2E8Jct2eGwsaeTZMGdv4INFZr48XMuP1/+YX6x/eNi2fFcbw6f/uhZ7l5r6lkM8ct0cbpiznAtzLnSvOmbpenhsKezxXbkHX6OKilRMOkORnh9DXHo4uz4+isPhmR3PbnOw+9MKUnOjSZ6gVFYcDeadk425yzagLT/mqisROh1d32wadB5z6REOvL2dbkMKCy7NR6jcu8WPDY1lccpiwrXhw5Z9vOKK1rn60rkcMECuRcdPXtzDofoW3j7yAtmJw69JVJATz9IuidraRfT5s/i6+RnK28vdnyB7CZz9O8i/YNhrBwrqyCjFpDMUQggWnJdNS233gHHd7rLvq2o6W8zMPSfLS9IpDEXShEiypsex6+OKfnf52rQ0Jn3yMdGXrRpwDofJROUPfkBZ5tlExenImef+bv3CnAt5YuUTSmvDYeCK1rltaQ6rrp2CtEtuaGzg4P5lqNQ2trS+4tY8fW33nzz3GZ0hGahCGnji8Cc8v+95ytrK3BdKpYZT7gBtKFhN0OS7Sp6+Qr9wAfp58zyeZ0wrfICJcxJIzIpgy3ulI7blW4w2tr5/hLS8aDKnKrHbo8mC8ydg6rJS+FlFv+c18c7U/c7167E1Nx93Tlqt1PzilxxtjaQzLIX5F+agcnN3rzAy+hZUO31+GlH2cuyWeG6fOpOrJ1/F64dfp6ixaMh5XLb7J74sofSTCrTWDp6Njycx4yuwJqI2TxmZgG99F567EIKs0Fr8bbeR9JN7PZ5nzCt8IQSLL8mhs9lM4ef9mwaGYufHRzF2WDll1SRltzfKJE2IZOKcBLZ/UD5gfSR7WxtVP7yH+r/8pfc1a00NFd9ZTcv7H3Jk1vUkZEaQt3B4dY+uff9a/rj1jx7JP57ZWNLIY7GxODQaqr5qZGH0NcSHxXP/lw8Oact32e73PvspVkMGDfYaLlrZSJP1KN+Z8T2KqkZoz152jzN6R+d5IbJgZMwrfICMKbFkz4hjy3ultDUYh3Vtc3UXOz86Su78RJKyI30kocJgLLkiF4Cv/nO43/PqqCgyn36KpJ/8BIDW116j+PQz6NqyhcabfofRqmXpVXnD3t2XtpX6rDzHWMdly7/pwhnsNDiYYBK8+M9NnBZ9D6X7VrlVRXNOlJZpMgFtdx2ay+bwQdVzzEuaxx0LV428jWHSNJh6sfO4sRjsnteYHw1aXn6Zg3Pn4ejq8miecaHwAZZfOxmhEnzx4gG3/4gddgefPrcPbYiaJVfm+VhChYGIiA1l/vnZlO5q4PC2/ovihc2ciTrCGRniMJpI+OHdhD/2GvvK9UxenExKzvAc7d3WbrqsXcdncSq4TV9b/i23zkRlaWFxRwjrPjLy6NXLWDghmsMtJ/+A97Xdv//AW1i0EbRMDuXZrfVMjTqFHy34kXfuslsr4LFlsCE47uB0E3OIvuJyj3PIxo3CD48JpWDVJCoPtLBtbZlb12x+p5T68g6WXztZKZLmZ2avyCR5YiSf//sALbWD73Jib7ie8Gtv5vP3m4iIDWHpVcP/sXbVf0kIU5KuRkJfW/6S/ETUs/XYNOF8u6GVxVkx/GXbX7jxgxv5b+GW48w7Ltv98797hzpbBjGqo7ziMHD3WVPZvPVM2lq9lBMRnQFn/hLmfcs78/kYw6KFJP30p6jDPeu94ZHCF0JcIYTYK4RwCCHmDzLuHCHEQSFEsRDiJ56s6QnTlqaSvziZLe8eGbLmeuHnlez48CjTlqYyaRiRHQq+Qa1RcfZt01FrVaz91x46W/ovnwzOBLm1/yykq9XMym9PJyRMM+z1XAo/Psz79dzHGxtLGlnTpkGjPUp3aDZP3f40U8LORSNC+fW2u4iMquGnbxTy0zcKKciJ58FlebQcNWAX7fwhrZnkKf9kxUwVj1w7Z+Akq5GweDVEpjhLLwR45I6UEofRiLR6VubD0x1+EbAKGLBdvBBCDTwKnAtMBa4RQgxdyMQHCCE47fp8UnOj+fTZfez4sPwk847DIdnybilf/ucQE2bFs+xqxZQTKITHhHLu6hl0tZl540/baaruPGlMR7OJdx7eRd2Rds66ddqI/S4GrYFzJ5xLZoSSZOcJLlv+I9fO4dv/+BYxqnIsuhzKH/yGzqIbiQyJ4M97fsB75S/xXmElL/76Pxx+tQRHmIonM7fiyHieqNBQokOi3UuyGglfPQRrlkJzqffn9hLGHTs4OGcuXVu2eDSP8IZTSgjxBXCPlPKkzgNCiFOAB6SUZ/c8/ymAlPL3Q807f/58uW2b95sZWM12Pnt+P8Xb60nMimDasjTCY0JobzCy7+saGo52MHlRMqddNxmNTul0FGjUl7fz3iO7MXXZmHJqCplTY9Fo1VQdanEmaUk465ZpTFSay/udNetLmJke1WvecTgcPLP6aUyqiWhNzTQ6qilNPkBnioMlLdcg6u2oLBU8ufB5LGH1iO5p/O3MP3FGnud9jAekoxYK/wMFdwVs3R3TwYMcufgS0h5+mMizVw46VgixXUrZr8Vl+Pe6wycN6BtEXQksGoV1B0Qbomblt6eRnh/Drk8q+PzfB3rPxaQYWPGtqUxWWhcGLIlZkVz9i0Vse/8Ie7+sZl9PQTshIHtmPEuuzPW41pHdYVfaGnqBE3fkm44082hGFnfoOnDsNROln86c9unQDt0qG6aoLl6L20CcIZM/nvUHLF3ZPXcIYT5plwhARDKc+n3ncWcDaMMgJLCyq1UGpzyOzpPvaofDkApfCPEJ0J/2+7mU8m2PVu9/vduB2wEyM313Oy2EYNrSNKYuSaW5uguL0YZOryE2xaDE2gcB+kgdy66ZzOJLc2it68ZqspOQFYEu1Dt7mAe+eYBd9bt499J3vTKfwvHmHYDvGLeT1NbAhM4OdkalsHReCuv2WTkn607WH2rE0pXdG49fWNnmO4XvwmaGp1dC8ky48jnfrjVMXM5aR5ePFb6UcoVHK0AV0Pd+LL3ntYHWexx4HJwmHQ/XHhIhBHFpgfVrruA+ulANiVnez49oMDZg0HoWEaFwPK5QTYA7X9rJYzfMY291G3/+8BAOKXlrdw0/Oz+f25bmHPfjUJAT73tlD6AJgaX3QEK+79caJqpwp46yd3hWQG00TDpbgVwhxASciv5q4NpRWFdBYcQ0djeSbFDMet7EZd5Zs76kV/H/64tSnvnWAt7dXU1du4l/fVHKtNSo0d3Z92XOdceOWyuc4ZsBgNBoEGFhODo9S7zySOELIS4F/gEkAO8LIXZJKc8WQqQCT0opz5NS2oQQdwIfAmrgaSnlXo+kVlDwMQ3GBqbHT/e3GGOSExV/3x38xpLGXiU/ajv7/ji4Dl69Hq5/DSae5h8ZTkAVbvC9DX8wpJRvAm/283o1cF6f52sBpTGoQlBgc9hoMbUona58TH8hln5V8n2ZsBQK7oT0Bf6WpBe1IdxjG/64ybRVUHAXq8PKzdNuZl6S5+VoFYIUnQFWPOD812ZxRu/4GVVEBHZ/7vAVFMYiYZow7p5/t7/FUAgU/nsTtFXAbZ+DWus3MaIuugih86zEi6LwFRROoNvajUM6MGiVEF0FYP6t0N3kV2UPzhpRnqKYdBQUTuCDIx9wysunUNNV429RFAKB3BUw6yrncYd3+mOPBGm1Ym/zrJaQovAVFE6gydQEoJRGVjiehkPwyELY9rRflq/7458oPmvwsgpDoZh0FBROoNnUTLg2nBB1iL9FUQgk4ibBvJtg0ll+WT5ixQp02Z711FYUvoLCCTQZm5TdvcLJqFSw8jfOYymhqxHCRy9017BoIYZFCz2aQzHpKCicQJOpibhQReErDML6P8BjS6GzftSWtHd2YTp0CIfFMuI5lB2+gsIJrMpdhUCJzlEYhCkXgt0K+tFLEuv84guq77mHiWvfJ2TixBHNoSh8BYUTuGDiBf4WQSHQSZrmfAAYW0EXDmrfqlOVq2KmB8lXiklHQaEPdoedktYSuq3d/hZFIRgwd8CTZ8LHv/D5UuqICEBR+AoKXqPR2Mglb1/Ce6Xv+VsUhWAgJAJmXgVTLvL5UsdKJI9c4SsmHQWFPigx+ArDZvmPjx0bWyAsxifLeKPrlbLDV1DoQ5OxR+ErUToKw2XfO/C3WVBb5JPpvdH1SlH4Cgp9UHb4CiMmYxFMvQhiPEuOGgiVwanwPamYqZh0FBT6oOzwFUZMRBJc/Ijz2G4Du9lZXtlLCK3W2fVKseErKHiHJWlLiNBFoNfq/S2KQrAiJbxyLSDhmledGbpewtOuV4rCV1Dow+TYyUyOnexvMRSCGSFg8rmgUntV2QMk/uAHaNPSRny9ovAVFPqwt2kvEdoIMiMz/S2KQjAz/1vHjs0dzvBNLxB92WUeXa84bRUU+nDfV/fxl21/8bcYCmOF2iJ4eLazKboXsFZVYS4tHfH1isJXUOhDs6lZidBR8B6xEyHndEjI88p0tb/5P6ruuWfE1ysmHQWFHmwOGy2mFkXhK3gPnR4ue/LYc0uXR5E7cbffjrSYR3y9ovAVFHpoNbcikcSGxvpbFIWxyOe/gwPvwy0fQkj4iKbQz53jkQiKwldQ6KHV1ApATKhvUuMVxjkZi8DUDprQEU9hKS/HUl5O+LJlI7peseErKPSQZEji76f/nbmJc/0tisJYZNKZcO6DzjLKVqMzXn+YtL71FhXfWY0cwbWgKHwFhV4idBGcnnk6ifpEf4uiMJbpaoLHT4dN/xr2pWqDAaREmkwjWlpR+AoKPRxpO8KGyg3YHDZ/i6IwlgmLgbR5kDR12JcKvTMD3NE9sn4NisJXUOhh3ZF13PHpHf4WQ2Gso1LBJY/CxNOcz23uR92o/KnwhRBXCCH2CiEcQoj5g4wrE0LsEULsEkJs82RNBQVf0WxqJlIXiUalxDIojBJ734JH5kNbpVvDPVX4nn6zi4BVwGNujD1dStno4XoKCj6jxdyihGQqjC7xeZA809kT1w1UeldNfD8ofCnlfgAhhCfTKCgEBC2mFiUkU2F0SZoKV7/oPHbYnZE7gzRD793hd3WNaDkx0vCe4yYR4gvgHillv+YaIcQRoAWQwGNSyscHmet24Paep5OBgx4L6DnxQDDdnQSbvBB8Mivy+p5gkzlQ5M2SUib0d2LIHb4Q4hMguZ9TP5dSvu2mAEuklFVCiETgYyHEASnlhv4G9vwYDPiD4A+EENuklAP6KAKNYJMXgk9mRV7fE2wyB4O8Qyp8KeUKTxeRUlb1/FsvhHgTWAj0q/AVFBQUFHyDz8MyhRAGIUSE6xhYidPZq6CgoKAwingalnmpEKISOAV4XwjxYc/rqUKItT3DkoCvhBC7gS3A+1JK7xSHHj0CysTkBsEmLwSfzIq8vifYZA54eb3itFVQUFBQCHyUTFsFBQWFcYKi8BUUFBTGCYrC7wchxKs9ZSB29ZSF2DXAuIAoGSGEeEAIUdVH5vMGGHeOEOKgEKJYCPGT0Zazjxx/EkIcEEIUCiHeFEJEDzDO7+/vUO+ZECKk5/tSLITYLITI9oOYLlkyhBCfCyH29ZQ8+Z9+xpwmhGjr8135pT9kPUGmQT9n4eTvPe9xoRDCb/WrhRCT+7x3u4QQ7UKIH5wwJuDe416klMpjkAfwF+CXA5wrA+IDQMYHcCa+DTZGDZQAEwEdsBuY6id5VwKanuM/AH8IxPfXnfcM+B6wpuf4auBVP8qbAsztOY4ADvUj72nAe/6ScSSfM3Ae8AEggMXAZn/L3Of7UYsz0Smg32PXQ9nhD4Jw1oy4EnjZ37J4gYVAsZSyVEppAV4BLvaHIFLKj6SUrhrEm4B0f8jhBu68ZxcDz/UcvwacKfxUa0RKWSOl3NFz3AHsB9L8IYuXuRh4XjrZBEQLIVL8LRRwJlAipSz3tyDuoij8wVkK1EkpDw9wXgIfCSG295SE8Cd39tzuPi2E6K8gTBpQ0ed5JYGhDG7BuXvrD3+/v+68Z71jen7E2gC/d0HvMS3NATb3c/oUIcRuIcQHQohpoytZvwz1OQfqd/dqBt4MBtp7DIzjnrZuloy4hsF3926XjPCUweQF/gX8Bucfzm9wmqFu8YUc7uLO+yuE+DlgA14cYJpRe3/HEkKIcOB14AdSyvYTTu/AaYLo7PH1vAXkjrKIJxJ0n7MQQgdcBPy0n9OB+B4D41jhyyFKRgghNDhLP88bZI5RKxkxlLwuhBBPAO/1c6oKyOjzPL3nNZ/gxvt7M3ABcKbsMXz2M4e/S3K48565xlT2fGeigKbREe9khBBanMr+RSnlGyee7/sDIKVcK4T4pxAiXvqxdLkbn/Oofnfd5Fxgh5Sy7sQTgfgeu1BMOgOzAjggpey3M4EIoJIRJ9gzLx1Ajq1ArhBiQs/u5GrgndGQ70SEEOcAPwYuklL2W9g7QN5fd96zd4Cbeo4vBz4b6AfM1/T4Dp4C9kspHxpgTLLLxyCEWIhTB/jzB8qdz/kd4MaeaJ3FQJuUsmaURT2RAe/+A+097su43eG7wUn2OSFEKvCklPI8nCUj3uz5XDXAS9J/JSP+KISYjdOkUwZ8B46XV0ppE0LcCXyIM7rgaSnlXj/J+wgQgvP2HWCTlHJ1oL2/A71nQohfA9uklO/gVLD/FkIUA804vzf+4lTgBmCPOBZK/DMgE0BKuQbnj9J3hRA2wAhc7a8fqB76/ZyFEKuhV+a1OCN1ioFu4Ft+khXo/WE6i56/s57X+sobaO9xL0ppBQUFBYVxgmLSUVBQUBgnKApfQUFBYZygKHwFBQWFcYKi8BUUFBTGCYrCV1BQUBgnKApfQUFBYZygKHwFBQWFccL/A21TUo418mmzAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x, y, \"x\", \n",
    "         t, f1(t), \":\", \n",
    "         t, f3(t), \"--\", \n",
    "         t, f9(t), \"-.\",\n",
    "         t, np.sin(t)\n",
    "        )\n",
    "plt.legend([\"data\", r\"$n=1$\", r\"$n=3$\", r\"$n=9$\", r\"$y=\\sin(x)$\"])\n",
    "plt.axis([-3 * np.pi, 3 * np.pi, -1.5, 1.5])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4efc0899",
   "metadata": {},
   "source": [
    "最小二乘拟合："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "2fc56019",
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy import optimize"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "adff5e75",
   "metadata": {},
   "source": [
    "定义一个关于x的函数，该函数有四个额外参数："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "873650e1",
   "metadata": {},
   "outputs": [],
   "source": [
    "def my_f(x, a, b, w, t):\n",
    "    return a * np.exp(-b * np.sin(w * x + t)) "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "66d86288",
   "metadata": {},
   "source": [
    "生成一组带噪声的数据："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "35539ed6",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.linspace(0, 2 * np.pi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "3dacee5a",
   "metadata": {},
   "outputs": [],
   "source": [
    "actual_parameters = [3, 2, 1.25, np.pi / 4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "b09547d5",
   "metadata": {},
   "outputs": [],
   "source": [
    "y = my_f(x, *actual_parameters)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "0a8c28fc",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_noise = y + 0.8 * np.random.randn(len(y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "ff28f231",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x11a5085e0>]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x, y, \"x\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "fd5e3f92",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x11a645b50>]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x, y_noise, \"x\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "0631128d",
   "metadata": {},
   "source": [
    "最小二乘法（Least Squares）是一种优化技术，它通过最小化误差的平方和来寻找一个与数据匹配的最佳函数。\n",
    "\n",
    "为了使用最小二乘法，需要先定义一个误差函数："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "7cf1405c",
   "metadata": {},
   "outputs": [],
   "source": [
    "def err_f(p, x, y):\n",
    "    return y - my_f(x, *p) "
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "4a4933a3",
   "metadata": {},
   "source": [
    "第一个参数p是要估计的真实参数，第二个参数x是数据的输入，第三个参数y是输入对应的数据值。\n",
    "\n",
    "利用该函数可以进行最小二乘估计："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "c0b349ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "c, rv = optimize.leastsq(err_f, [1,1,1,1], args=(x, y_noise))"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "b315f1b5",
   "metadata": {},
   "source": [
    "找到最小二乘解时，rv返回1到4中的某个值，c返回找到的最小二乘估计："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "43703841",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2.73620073, 2.08882198, 1.20078322, 0.93881627])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "2dbe1ef5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rv"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05083450",
   "metadata": {},
   "source": [
    "真实参数为："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "9ea8e294",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[3, 2, 1.25, 0.7853981633974483]"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "actual_parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "c357b0ad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x11a65ab20>"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(x, y_noise, \"x\", \n",
    "         x, y,\n",
    "         x, my_f(x, *c), \":\")\n",
    "plt.legend([\"data\", \"actual\", \"leastsq\"])"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "e0fb7ce6",
   "metadata": {},
   "source": [
    "也可以不定义误差函数，用函数`optimize.curve_fit()`直接对`my_f()`的参数进行拟合："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "91b6177a",
   "metadata": {},
   "outputs": [],
   "source": [
    "p_est, err_est = optimize.curve_fit(my_f, x, y_noise)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "b1bfdf22",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2.7362006 , 2.08882203, 1.20078321, 0.93881632])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p_est"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "08076712",
   "metadata": {},
   "source": [
    "## 最值优化："
   ]
  },
  {
   "cell_type": "markdown",
   "id": "60a01dae",
   "metadata": {},
   "source": [
    "物理上斜抛运动的水平距离公式为："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "1147640f",
   "metadata": {},
   "outputs": [],
   "source": [
    "def fly_dist(theta, v0):\n",
    "    g = 9.8\n",
    "    theta_rad = np.pi * theta / 180.\n",
    "    return v0 ** 2 / g * np.sin(2 * theta_rad) "
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "388d601d",
   "metadata": {},
   "source": [
    "theta是采用度数进行衡量的，取值为0°到90°。v0是初始加速度。可以知道，在v0固定时，水平距离最大的角度是45°。\n",
    "\n",
    "利用最小值优化函数`optimize.minimize()`可以得到这个结果。不过，为了获得最大值，首先要将最大值的问题转为求最小值的问题："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "d8d65c67",
   "metadata": {},
   "outputs": [],
   "source": [
    "fly_dist_neg = lambda theta, v0: - fly_dist(theta, v0)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "31ec6696",
   "metadata": {},
   "source": [
    "设定初始猜测为10°，并将初速度v0通过额外参数传入："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "ce17617d",
   "metadata": {},
   "outputs": [],
   "source": [
    "res = optimize.minimize(fly_dist_neg, 10, args=(1,))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "4755eda8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "      fun: -0.10204081529676719\n",
       " hess_inv: array([[8179.23375443]])\n",
       "      jac: array([5.06639481e-07])\n",
       "  message: 'Optimization terminated successfully.'\n",
       "     nfev: 22\n",
       "      nit: 4\n",
       "     njev: 11\n",
       "   status: 0\n",
       "  success: True\n",
       "        x: array([45.00406995])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "3f65eaa9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([45.00406995])"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res.x"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "db01d64c",
   "metadata": {},
   "source": [
    "### 方程求根"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d6bdfd2c",
   "metadata": {},
   "source": [
    "考虑这样的一个函数："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "51cfbeba",
   "metadata": {},
   "outputs": [],
   "source": [
    "func = lambda x: x + np.cos(x)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "6b6ea00a",
   "metadata": {},
   "source": [
    "可以使用`optimize.root()`函数求这个函数为0的值："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "fbc8bc7d",
   "metadata": {},
   "outputs": [],
   "source": [
    "sol = optimize.root(func, 0.3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "e69a06e7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.73908513])"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sol.x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "76919ceb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.11022302e-16])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sol.fun"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "8feed71c",
   "metadata": {},
   "source": [
    "`optimize.root()`函数还可以求解方程组："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "fbaea4cb",
   "metadata": {},
   "outputs": [],
   "source": [
    "func2 = lambda x: [x[0]*np.cos(x[1]) - 4, x[0]*x[1] - x[1] - 5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "b9bfc880",
   "metadata": {},
   "outputs": [],
   "source": [
    "sol = optimize.root(func, [1, 1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "296709ce",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.73908513, -0.73908513])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sol.x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "ed91719a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-3.21964677e-15,  3.10862447e-15])"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sol.fun"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e58c6ea3",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
